import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cv2
import seaborn as sns
sns.set(color_codes=True)
import statsmodels.api as sm
import warnings
warnings.filterwarnings("ignore")
data_wifi=pd.read_csv("Data Pengguna WiFi di Kota Bandung Tahun 2017.csv")
data_wifi=data_wifi.dropna()
data_wifi
data_wifi.head()
data_wifi.shape
data_wifi=data_wifi.drop(columns=['alamat','deskripsi']) #menghapus kolom alamat dan deskripsi
data_wifi.head()
for i in range (len(data_wifi)): #mencari lokasi yang mempunyai Grand Total=0
if data_wifi['Grand Total'][i]==0:
print('Indeks ke-',i,end=' : ')
print(data_wifi['nama_lokasi'][i])
for i in range(len(data_wifi)):
if data_wifi['Grand Total'][i]==0: #mengapus baris yang mempunyai Grand Total=0
data_wifi=data_wifi.drop([i])
data_wifi=data_wifi.reset_index(drop=True) #mereset urutan index setelah baris Grand Total=0 dihapus
data_wifi
data_wifi['nama_lokasi'][26]
for i in range(len(data_wifi)):
if data_wifi.longitude[i]==0 or data_wifi.latitude[i]==0:
print('Indeks ke-',i,end=' : ')
print(data_wifi['nama_lokasi'][i])
for i in range(len(data_wifi)):
if data_wifi.longitude[i]==0 or data_wifi.latitude[i]==0:
data_wifi=data_wifi.drop([i])
long_min=data_wifi.longitude.min()
long_max=data_wifi.longitude.max()
lat_min=data_wifi.latitude.min()
lat_max=data_wifi.latitude.max()
print('Longitude minimum :',long_min)
print('Longitude maximum :',long_max)
print('Latitude minimum :',lat_min)
print('Latitude maximum :',lat_max)
bandung_map=plt.imread('bandung_map.png')
plt.figure(figsize=(10,10))
plt.scatter(data_wifi.longitude, data_wifi.latitude, zorder=1, alpha=0.4,
color='red', s=100)
plt.title('Plotting Access Point (AP) pada Map Bandung')
plt.xlim(long_min, long_max)
plt.ylim(lat_min, lat_max)
plt.imshow(bandung_map, zorder=0, extent=[long_min, long_max, lat_min, lat_max],
aspect='equal')
plt.show()
plt.savefig('Plotting Access Point pada Map Bandung.png', bbox_inches='tight')
plt.savefig('Plotting Access Point pada Map Bandung.pdf', bbox_inches='tight')
img=cv2.imread('bandung_map.png')
cv2.imwrite('Plotting Access Point pada Map Bandung.png',img)
data_wifitranspose=data_wifi
data_wifitranspose.head()
data_wifitranspose=data_wifitranspose.drop(columns=['longitude','latitude'])
data_wifitranspose.head()
data_wifitranspose=data_wifitranspose.T #mentranspose baris menjadi kolom dan kolom menjadi baris
data_wifitranspose.head()
data_wifitranspose.columns=data_wifitranspose.iloc[0] #mengubah nama kolom dg baris pertama pada DataFrame
data_wifitranspose.head()
data_wifitranspose=data_wifitranspose.drop(['nama_lokasi'])
data_wifitranspose.head()
data_wifi_T=data_wifitranspose
data_wifi_T.head()
data_wifi_T.shape
category=data_wifi_T.columns.to_numpy(str) #nama lokasi
grand_total=data_wifi_T.iloc[-1].values #grand total
x=np.arange(len(category))
y=grand_total/1000
plt.figure(figsize=(10,20))
plt.title('Total Pengguna WiFi di Kota Bandung 2017 Setiap Lokasi')
plt.barh(x,y,align='center',color='teal',zorder=2)
plt.yticks(x,category)
plt.xlabel('Jumlah (dalam ribu)')
plt.grid()
plt.show()
plt.savefig('Grafik Pengguna WiFi Sebelum Diurutkan.pdf')
plt.savefig('Grafik Pengguna WiFi Sebelum Diurutkan.png', bbox_inches='tight')
data={'Lokasi':category,
'Total':grand_total}
data_grand_total=pd.DataFrame(data)
data_grand_total=data_grand_total.sort_values(by=['Total'])
data_grand_total.head()
plt.figure(figsize=(10,20))
plt.title('Total Pengguna WiFi di Kota Banding 2017 Setiap Lokasi')
plt.barh(x, data_grand_total['Total'])
plt.yticks(x, data_grand_total['Lokasi'])
plt.xlabel('Jumlah (dalam ribu)')
plt.grid()
plt.show()
plt.savefig('Grafik Pengguna WiFi Setelah Diurutkan.pdf')
plt.savefig('Grafik Pengguna WiFi Setelah Diurutkan.png')
plt.figure(figsize=(10,20))
plt.title('Total Pengguna WiFi di Kota Banding 2017 Setiap Lokasi')
plt.barh(x, data_grand_total['Total'])
plt.yticks(x, data_grand_total['Lokasi'])
plt.xlabel('Jumlah (dalam ribu)')
plt.show()
plt.savefig('Grafik Pengguna WiFi Setelah Diurutkan.pdf')
plt.savefig('Grafik Pengguna WiFi Setelah Diurutkan.png')
max_10=data_grand_total['Lokasi'].tail(10).to_numpy(str)
min_10=data_grand_total['Lokasi'].head(10).to_numpy(str)
data_new=np.concatenate((max_10,min_10))
print('10 titik pengguna WiFi terbanyak:',max_10)
print('10 titik pengguna WiFi terendah:',min_10)
print('Lokasi untuk dianalisis:',data_new)
data_wifi_T=data_wifi_T[data_new]
data_wifi_T=data_wifi_T.drop(['Grand Total'])
data_wifi_T.tail()
category=data_wifi_T.columns.astype(str)
plt.figure(figsize=(10,5))
plt.title('10 Lokasi Pengguna WiFi Terbanyak')
for i in range(10):
plt.plot(data_wifi_T.index, data_wifi_T[category[i]], label=category[i],
marker=i)
plt.ylabel('Jumlah Pengguna WiFi')
plt.legend(loc='best')
plt.grid()
plt.xticks(data_wifi_T.index, rotation=60)
plt.show()
plt.savefig('Grafik 10 Lokasi Pengguna Wifi Terbanyak.pdf')
plt.savefig('Grafik 10 Lokasi Pengguna WiFi Terbanyak.png')
plt.figure(figsize=(10,5))
plt.title('10 Lokasi Pengguna WiFi Terendah')
for i in range(10):
plt.plot(data_wifi_T.index, data_wifi_T[category[-i-1]], label=category[-i-1],
marker=i)
plt.ylabel('Jumlah Pengguna WiFi')
plt.legend(loc='best')
plt.grid()
plt.xticks(data_wifi_T.index, rotation=60)
plt.show()
plt.savefig('Grafik 10 Lokasi Pengguna WiFi Terendah.png')
plt.savefig('Grafik 10 Lokasi Pengguna WiFi Terendah.pdf')
explode=(0,0.1,0,0,0,0,0,0,0,0.2,0,0)
plt.figure(figsize=(8,8))
plt.title('Perbandingan Persentase Pengguna WiFi Setiap Bulan di Masjid Salman ITB Tahun 2017')
plt.pie(data_wifi_T['Masjid Salman ITB'], autopct='%.2f%%', shadow=True, startangle=20,
explode=explode, labels=data_wifi_T.index, textprops={'fontsize':13})
lingkar_tengah=plt.Circle((0,0), 0.75, fc='white')
fig=plt.gcf()
fig.gca().add_artist(lingkar_tengah)
plt.savefig('Perbandingan Persentase Pengguna WiFi Setiap Bulan di Masjid Salman ITB Tahun 2017.pdf')
plt.savefig('Perbandingan Persentase Pengguna WiFi Setiap Bulan di Masjid Salman ITB Tahun 2017.png')
for w in max_10: #w adalah variabel dari 10 lokasi pengguna WiFi terbanyak
plt.figure(figsize=(8,8))
plt.title(w)
plt.pie(data_wifi_T[w], autopct='%.2f%%', shadow=True, startangle=20,
labels=data_wifi_T.index, textprops={'fontsize':13})
lingkar_tengah=plt.Circle((0,0), 0.75, fc='white')
fig=plt.gcf()
fig.gca().add_artist(lingkar_tengah)
plt.show()
for w in min_10: #w adalah variabel dari 10 lokasi pengguna WiFi terbanyak
plt.figure(figsize=(8,8))
plt.title(w)
plt.pie(data_wifi_T[w], autopct='%.2f%%', shadow=True, startangle=20,
labels=data_wifi_T.index, textprops={'fontsize':13})
lingkar_tengah=plt.Circle((0,0), 0.75, fc='white')
fig=plt.gcf()
fig.gca().add_artist(lingkar_tengah)
plt.show()
print(np.arange(len(data_wifi_T.index))) #index dimulai dari nol, terdapat 12 data=12 bulan
sumbu_x=range(len(data_wifi_T.index))
for w in min_10:
plt.figure(figsize=(8,8))
plt.title(w)
plt.bar(sumbu_x, data_wifi_T[w])
plt.xticks(sumbu_x, data_wifi_T.index, rotation=60)
plt.show()
for w in min_10:
for j in range(len(data_wifi_T.index)):
if data_wifi_T[w][j]==0:
print(w,j)
data_wifi_T[w]=data_wifi_T[w].drop(index=data_wifi_T.index[j])
for w in min_10:
plt.figure(figsize=(8,8))
plt.title(w)
plt.pie(data_wifi_T[w].dropna(), autopct='%.2f%%',
shadow=True, startangle=20, labels=data_wifi_T[w].dropna().index,
textprops={'fontsize':13})
lingkar_tengah=plt.Circle((0,0),0.75,fc='white')
fig=plt.gcf()
fig.gca().add_artist(lingkar_tengah)
plt.show()
data_wifi_T.tail()
from datetime import datetime
datemin=datetime(2017, 1, 1)
datemax=datetime(2017, 12, 31)
data_wifi_T['Bulan']=pd.date_range(datemin, datemax, freq='M').to_pydatetime().tolist()
data_wifi_T.head()
hari_365=pd.date_range(datemin, datemax, freq='D').to_pydatetime().tolist()
data_wifi_T['Masjid Salman ITB'].head()
y_hh=np.zeros(shape=(12,31))
y_salman=data_wifi_T['Masjid Salman ITB']
for i in range (len(data_wifi_T)):
y_hh[i,0:data_wifi_T['Bulan'][i].day]=(np.random.multinomial(y_salman[i],
np.ones(data_wifi_T['Bulan'][i].day)/data_wifi_T['Bulan'][i].day,
size=1)[0])
y_hh.shape
y_hh=y_hh[y_hh!=0].flatten()
from fbprophet import Prophet
data_salman={'ds':hari_365,
'y':y_hh}
data_wifi_salman=pd.DataFrame.from_dict(data_salman, orient='index').T
data_wifi_salman=data_wifi_salman.reset_index(drop=True)
data_wifi_salman.tail()
plt.figure(figsize=(10,5))
sns.lineplot(x="ds",y=data_wifi_salman['y'].astype(int),data=data_wifi_salman)
plt.xticks(rotation=15)
plt.xlabel('Tanggal')
plt.ylabel('Jumlah Harian Pengguna WiFi')
plt.show()
pred_size=100 #hari
m=Prophet(yearly_seasonality=False, daily_seasonality=False,
weekly_seasonality=True, changepoint_prior_scale=100,
n_changepoints=100)
m.fit(data_wifi_salman)
future=m.make_future_dataframe(periods=pred_size, freq='D')
pred=m.predict(future)
pred.head()
m.plot(pred[:pred_size])
m.plot_components(pred[:pred_size]);
plt.figure(figsize=(10,5))
plt.title('Masjid Salman ITB')
plt.plot(data_wifi_salman['ds'], pred['yhat'][:-pred_size], label='Prediksi')
plt.plot(data_wifi_salman['ds'], pred['yhat_lower'][:-pred_size],label='Batas Bawah')
plt.plot(data_wifi_salman['ds'], pred['yhat_upper'][:-pred_size],label='Batas Atas')
plt.plot(data_wifi_salman['ds'], data_wifi_salman['y'], label='Data Asli')
plt.grid()
plt.legend(loc='best')
plt.show()
plt.figure(figsize=(10,5))
plt.title('Masjid Salman ITB')
plt.plot(data_wifi_salman['ds'], pred['yhat'][:-pred_size], label='Prediksi')
plt.plot(data_wifi_salman['ds'], pred['yhat_lower'][:-pred_size],label='Batas Bawah')
plt.plot(data_wifi_salman['ds'], pred['yhat_upper'][:-pred_size],label='Batas Atas')
plt.plot(data_wifi_salman['ds'], data_wifi_salman['y'], label='Data Asli')
plt.legend(loc='best')
plt.show()
data_wifi_salman['prophet']=pred['yhat'][:-pred_size]
data_wifi_salman['delta']=abs(data_wifi_salman['y']-data_wifi_salman['prophet'])
data_wifi_salman.head(10)
from sklearn.metrics import mean_absolute_error,r2_score
print("Score MEA :",mean_absolute_error(data_wifi_salman['y'], pred['yhat'][:-pred_size]))
print("Score R2 :",r2_score(data_wifi_salman['y'], pred['yhat'][:-pred_size]))
data_wifi_T['Masjid Salman ITB'].head()
from fbprophet import Prophet
data_tf={'ds':data_wifi_T['Bulan'], 'y':data_wifi_T['Masjid Salman ITB']}
data_wifi_tf=pd.DataFrame.from_dict(data_tf, orient='index').T
data_wifi_tf=data_wifi_tf.reset_index(drop=True)
data_wifi_tf.tail()
pred_size=3 #bulan
m=Prophet(yearly_seasonality=False, daily_seasonality=False,
weekly_seasonality=False, n_changepoints=6, changepoint_prior_scale=100)
m.fit(data_wifi_tf)
future=m.make_future_dataframe(periods=pred_size, freq='M')
pred=m.predict(future)
pred.head()
m.plot(pred[:-pred_size]);
m.plot_components(pred[:-pred_size]);
plt.figure(figsize=(10,5))
plt.title('Masjid Salman ITB')
pred['yhat'].plot(label='Prediksi')
pred['yhat_lower'][:-pred_size].plot(label='Batas Bawah')
pred['yhat_upper'][:-pred_size].plot(label='Batas Atas')
data_wifi_tf['y'].plot(label='Data Asli')
plt.grid('off')
plt.legend(loc='best')
plt.show()
plt.figure(figsize=(10,5))
plt.title('Masjid Salman ITB')
pred['yhat'].plot(label='Prediksi')
pred['yhat_lower'][:-pred_size].plot(label='Batas Bawah')
pred['yhat_upper'][:-pred_size].plot(label='Batas Atas')
data_wifi_tf['y'].plot(label='Data Asli')
plt.legend(loc='best')
plt.show()
data_wifi_tf['prophet']=pred['yhat']
data_wifi_tf['delta']=abs(data_wifi_tf['y']-data_wifi_tf['prophet'])
data_wifi_tf.head(12)
from sklearn.metrics import mean_absolute_error,r2_score
print("Score MEA :",mean_absolute_error(data_wifi_tf['y'], pred['yhat'][:-pred_size]))
print("Score R2 :",r2_score(data_wifi_tf['y'], pred['yhat'][:-pred_size]))
data_wifi_salman=data_wifi_salman.set_index('ds')
data_wifi_salman.index
data_wifi_salman=data_wifi_salman['y']
y=data_wifi_salman.astype(int)
mod = sm.tsa.statespace.SARIMAX(y,
order=(1, 1, 1),
seasonal_order=(1, 1, 0, 12),
enforce_stationarity=True,
enforce_invertibility=True)
hasil = mod.fit()
pred = hasil.get_prediction(start=pd.to_datetime('2017-08-31'), dynamic=False)
y['2017':].plot(label='Data Asli')
pred.predicted_mean.plot(label='Data Prediksi', alpha=.7, figsize=(14, 7))
plt.xlabel('Tanggal')
plt.ylabel('Jumlah Pengguna WiFi')
plt.legend()
plt.show()
import datetime
pred_uc = hasil.get_forecast(steps=30)
y['2017':].plot(label='Data Asli', figsize=(14, 7))
pred_uc.predicted_mean.plot(label='Data Prediksi')
plt.xlabel('Tanggal')
plt.ylabel('Pengguna WiFi Kota Bandung')
plt.xlim([datetime.date(2017, 12, 1),
datetime.date(2018, 1, 31)])
plt.legend()
plt.show()
print("Jumlah Pengguna WiFi bulan Januari 2018",round(sum(pred_uc.predicted_mean)),"orang")